package com.dlyk.manager;

import com.dlyk.mapper.ClueMapper;
import com.dlyk.mapper.CustomerMapper;
import com.dlyk.model.Clue;
import com.dlyk.model.Customer;
import com.dlyk.model.User;
import com.dlyk.query.CustomerQuery;
import jakarta.annotation.Resource;
import org.springframework.beans.BeanUtils;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

/**
 * Manager 层：通用业务处理层，它有如下特征：
 * 1） 对第三方平台封装的层，预处理返回结果及转化异常信息。
 * 2） 对 Service 层通用能力的下沉，如缓存方案、中间件通用处理。
 * 3） 与 DAO 层交互，对多个 DAO 的组合复用
 *
 * 这个类对应第三条，注入了多个DAO
 */
@Component
public class CustomerManager {

    @Resource
    private ClueMapper clueMapper;

    @Resource
    private CustomerMapper customerMapper;

    /**
     * 添加客户（线索转换客户）
     */
    // 开启事务，两条SQL应该同时成功或者同时失败，否则数据不一致
    @Transactional(rollbackFor = Exception.class)
    public int saveCustomerByClue(CustomerQuery customerQuery) {

        Customer customer = new Customer();
        // 使用BeanUtils工具将CustomerQuery对象的属性复制到Customer对象中
        BeanUtils.copyProperties(customerQuery, customer);

        // 线索转换客户之前，先根据线索id更改线索状态为已转客户
        int update = clueMapper.updateClueStateById(customer.getClueId());

        // 更新语句执行成功后，再向客户表添加数据

        // 获取创建者（当前登录用户）
        User loginUser = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

        // 设置创建时间
        customer.setCreateTime(new Date());
        // 设置创建者
        customer.setCreateBy(loginUser.getId());

        // 向客户表添加数据
        int insert = customerMapper.insertSelective(customer);

        return update + insert;
    }

    /**
     * 编辑客户详细信息
     */
    // 开启事务，保证两条sql同时成功或失败，确保数据一致性
    @Transactional(rollbackFor = Exception.class)
    public int editCustomer(CustomerQuery customerQuery) {

        // 获取线索id
        Integer clueId = customerQuery.getClueId();
        // 是否贷款
        Integer needLoan = customerQuery.getNeedLoan();
        // 意向产品（线索表和客户表的意向产品id都需要修改）
        Integer clueProduct = customerQuery.getProduct();

        // 线索信息
        Clue clue = new Clue();
        clue.setId(clueId);
        clue.setNeedLoan(needLoan);
        clue.setIntentionProduct(clueProduct);

        // 修改线索相关信息
        int editClue = clueMapper.updateByPrimaryKeySelective(clue);

        // 获取客户id
        Integer customerId = customerQuery.getId();
        // 意向产品（线索表和客户表的意向产品id都需要修改）
        Integer product = customerQuery.getProduct();
        // 下次联系时间
        Date nextContactTime = customerQuery.getNextContactTime();

        // 客户信息
        Customer customer = new Customer();
        customer.setId(customerId);
        customer.setProduct(product);
        customer.setNextContactTime(nextContactTime);
        // 获取编辑者（当前登录用户）
        User loginUser = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        // 设置编辑者
        customer.setEditBy(loginUser.getId());
        // 设置编辑时间
        customer.setEditTime(new Date());

        // 修改客户信息
        int editCustomer = customerMapper.updateByPrimaryKeySelective(customer);

        return editCustomer + editClue;
    }

}

